package com.lawyer.util.date;

import com.lawyer.common.StringUtil;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @description: 日期工具
 * @author: wzq
 */
public class DateUtil {

    /**
     * 格式化对"
     */
    public final static SimpleDateFormat FORMATTER = new SimpleDateFormat("yyyy-MM-dd");

    /**
     * 默认显示日期的格"
     */
    public static final String DATAFORMAT_STR = "yyyy-MM-dd";

    /**
     * 默认显示日期的格"
     */
    public static final String YMDATEFORMAT_STR = "yyyyMM";
    /**
     * 默认显示日期的格"
     */
    public static final String YYYY_MM_DATAFORMAT_STR = "yyyy-MM";

    /**
     * 默认显示日期的格"
     */
    public static final String YYYY_MM_DATAFORMAT_STR_DOT = "yyyy.MM";
    /**
     * 默认显示日期时间的格"
     */
    public static final String DATATIMEF_STR = "yyyy-MM-dd HH:mm:ss";
    /**
     * 默认显示"中文日期的格式"
     */
    public static final String ZHCN_DATAFORMAT_STR = "yyyy年MM月dd";
    /**
     * 默认显示"中文日期的格式"
     */
    public static final String ZHCN_DATAFORMAT_MD = "MM月dd";
    /**
     * 默认显示"中文日期时间的格式"
     */
    public static final String ZHCN_DATATIMEF_STR = "yyyy年MM月dd日HH时mm分ss";

    private static DateFormat dateFormat = new SimpleDateFormat(DATAFORMAT_STR);
    private static DateFormat dateTimeFormat = new SimpleDateFormat(DATATIMEF_STR);;
    private static DateFormat zhcnDateFormat = null;
    private static DateFormat zhcnDateTimeFormat = null;
    public static final String WECHATMSGDATEFORMAT = "yyyy年MM月dd日 HH:mm:ss";

    /**
     * 格式化时间
     * @param date
     * @return
     */
    public static String formatDateAndTimeNONULL(java.util.Date date) {
        return format(date, "yyyyMMddHHmmssSSS");
    }
    /**
     * 格式化日期（字符串）
     *
     * @param dateStr
     *            字符型日期"
     * @param format
     *            格式
     * @return 返回日期
     */
    public static Date parseDate(String dateStr, String format) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            return sdf.parse(dateStr);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 格式化日期（日期）
     *
     * @param date
     *            日期
     * @param format
     *            格式
     * @return 返回日期
     */
    public static Date parseDate(Date date, String format) {
        return parseDate(format(date, format), format);
    }

    /**
     * 格式化输出日期字符串
     *
     * @param date
     *            日期
     * @param format
     *            格式
     * @return 返回字符型日"
     */
    public static String format(Date date, String format) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            return sdf.format(date);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 判断两个时间是否为同年同月同日（年月日的比较）
     *
     * @param date1
     * @param date2
     * @return
     */
    public static boolean sameDate(Date date1, Date date2) {
        try {
            date1 = FORMATTER.parse(FORMATTER.format(date1));
            date2 = FORMATTER.parse(FORMATTER.format(date2));
            if (date1.getTime() == date2.getTime()) {
                return true;
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 判断日期一是否小于时间二（该方法参数有先后顺序）
     * @param date1
     * @param date2
     * @return
     */
    public static boolean date1LessThanOrEqualToDate2(Date date1, Date date2) {
        try {
            date1 = FORMATTER.parse(FORMATTER.format(date1));
            date2 = FORMATTER.parse(FORMATTER.format(date2));
            if (date1.getTime() <= date2.getTime()) {
                return true;
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 日期加
     *
     * @param date
     * @param field 1年份操作，2是月份操作，3是对星期操作，5是对日期操作，11是对小时操作，12是对分钟操作，13是对秒操作，14是对毫秒操作
     * @param amount
     * @return 返回相加后的日期
     */
    public static Date dateAdd(Date date, int field, int amount) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(field, amount);
        return c.getTime();
    }

    /**
     * @function：格式化日期，格式yyyy-MM-dd
     * @param date
     * @return
     * @returnType：String
     */
    public static String formatDate(Date date) {
        return format(date, "yyyy-MM-dd");
    }

    /**
     *
     * @function：parse时间，格式yyyy-MM-dd
     * @param dateStr
     * @return
     * @returnType：Date
     * @author：xupeng
     * @createTime：Jul 7, 2014
     */
    public static Date parseDate(String dateStr) {
        return parseDate(dateStr, "yyyy-MM-dd");
    }

    /**
     *
     * @function：parse时间，格式HH:mm:ss
     * @param dateStr
     * @return
     * @returnType：Date
     * @author：xupeng
     * @createTime：Jul 7, 2014
     */
    public static Date parseTime(String dateStr) {
        return parseDate(dateStr, "HH:mm:ss");
    }

    /**
     * @function：parse时间，格式HH:mm
     * @param dateStr
     * @return
     */
    public static Date parseHourAndMinut(String dateStr) {
        return parseDate(dateStr, "HH:mm");
    }

    /**
     *
     * @function：parse时间，格式yyyy-MM-dd HH:mm:ss
     * @param dateStr
     * @return
     * @returnType：Date
     * @author：xupeng
     * @createTime：Jul 7, 2014
     */
    public static Date parseDateAndTime(String dateStr) {
        return parseDate(dateStr, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     *
     * @function：格式化时间，格式HH:mm:ss
     * @param date
     * @return
     * @returnType：String
     * @author：xupeng
     * @createTime：Jul 7, 2014
     */
    public static String formatTime(Date date) {
        return format(date, "HH:mm:ss");
    }

    /**
     *
     * @function：格式化时间，格式yyyy-MM-dd HH:mm:ss
     * @param date
     * @return
     * @returnType：String
     * @author：xupeng
     * @createTime：Jul 7, 2014
     */
    public static String formatDateAndTime(Date date) {
        return format(date, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     *
     * @function：格式化时间，格式yyyy-MM-dd HH:mm
     * @param date
     * @return
     * @returnType：String
     * @author：xupeng
     * @createTime：Jul 7, 2014
     */
    public static String formatDateWithoutS(Date date) {
        return format(date, "yyyy-MM-dd HH:mm");
    }

    /**
     * 返回年份
     *
     * @param date
     *            日期
     * @return 返回年份
     */
    public static int getYear(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        return c.get(Calendar.YEAR);
    }

    /**
     * 返回月份
     *
     * @param date
     *            日期
     * @return 返回月份
     */
    public static int getMonth(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        return c.get(Calendar.MONTH) + 1;
    }

    /**
     * 返回日份
     *
     * @param date
     *            日期
     * @return 返回日份
     */
    public static int getDay(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        return c.get(Calendar.DAY_OF_MONTH);
    }

    /**
     * 返回小时
     *
     * @param date
     *            日期
     * @return 返回小时
     */
    public static int getHour(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        return c.get(Calendar.HOUR_OF_DAY);
    }

    /**
     * 返回分钟
     *
     * @param date
     *            日期
     * @return 返回分钟
     */
    public static int getMinute(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        return c.get(Calendar.MINUTE);
    }

    /**
     * 返回秒钟
     *
     * @param date
     *            日期
     * @return 返回秒钟
     */
    public static int getSecond(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        return c.get(Calendar.SECOND);
    }

    /**
     * 返回毫秒
     *
     * @param date
     *            日期
     * @return 返回毫秒
     */
    public static long getMillis(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        return c.getTimeInMillis();
    }

    /**
     * 返回字符型日"
     *
     * @param date
     *            日期
     * @return 返回字符型日"
     */
    public static String getStrDate(Date date) {
        return format(date, "yyyy-MM-dd");
    }

    /**
     * 返回字符型日"
     *
     * @param date
     *            日期
     * @return 返回字符型日"
     */
    public static Date getDate(Date date) {
        return DateUtil.parseDate(format(date, "yyyy-MM-dd"), "yyyy-MM-dd");
    }

    /**
     * 返回字符型时"
     *
     * @param date
     *            日期
     * @return 返回字符型时"
     */
    public static String getTime(Date date) {
        return format(date, "HH:mm:ss");
    }

    public static String getHoureMinut(Date date) {
        return format(date, "HH:mm");
    }

    /**
     * 取得指定月份的第"��
     *
     * @param strdate
     *            String
     * @return String
     */
    public static String getMonthBegin(String strdate, String format) {
        Date date = parseDate(strdate, format);
        return format(date, "yyyy-MM") + "-01";
    }

    /**
     * 取得指定月份的最后一"
     *
     * @param strdate
     *            String
     * @return String
     */
    public static String getMonthEnd(String strdate, String format) {
        Date date = parseDate(strdate, format);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, 1);
        calendar.add(Calendar.DAY_OF_YEAR, -1);
        return formatDate(calendar.getTime());
    }

    /**
     * 日期加或减月
     *
     * @param date
     *            日期
     * @param days
     *            天数
     * @return 返回相加后的日期
     */
    public static Date dateAddOrDiffDay(Date date, int days) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.DATE, days);
        return c.getTime();
    }

    /**
     * "��定日期中的年月日相加
     *
     * @param date
     *            String 日期字符"
     * @param field
     *            int "��加的字段 """
     * @param amount
     *            int 加多"
     * @return String
     */
    public static String addDate(Date date, int field, int amount) {
        int temp = 0;
        if (field == 1) {
            temp = Calendar.YEAR;
        }
        if (field == 2) {
            temp = Calendar.MONTH;
        }
        if (field == 3) {
            temp = Calendar.DATE;
        }

        String Time = "";
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            cal.add(temp, amount);
            Time = sdf.format(cal.getTime());
            return Time;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }

    /**
     * "��定日期中的年月日相加
     *
     * @param date
     *            String 日期字符"
     * @param field
     *            int "��加的字段 """
     * @param amount
     *            int 加多"
     * @return String
     */
    public static Date getAddDate(Date date, int field, int amount) {
        int temp = 0;
        if (field == 1) {
            temp = Calendar.YEAR;
        }
        if (field == 2) {
            temp = Calendar.MONTH;
        }
        if (field == 3) {
            temp = Calendar.DATE;
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(temp, amount);
        return cal.getTime();
    }

    /**
     * 日期加或减月
     *
     * @param date
     *            日期
     * @param months
     *            月数
     * @return 返回相加后的日期
     */
    public static Date dateAddOrDiffMonth(Date date,
                                                    int months) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.MONTH, months);
        return c.getTime();
    }

    /**
     * 日期加或减月
     *
     * @param date
     *            日期
     * @param seconds
     *            月数
     * @return 返回相加后的日期
     */
    public static Date dateAddOrDiffSecond(Date date,int seconds) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.SECOND, seconds);
        return c.getTime();
    }

    /**
     *
     * @function：两个日期相隔天"014-03-26"014-03-26=0"014-03-25"014-03-26=1
     * @param startDate
     *            格式yyyy-MM-dd
     * @param endDate
     *            格式yyyy-MM-dd
     * @return
     * @returnType：long
     * @author：xupeng
     * @createTime：Mar 26, 2014
     */
    public static long diffDays(Date startDate, Date endDate) {
        startDate = DateUtil.getDate(startDate);
        endDate = DateUtil.getDate(endDate);
        Calendar startCalendar1 = Calendar.getInstance(), endCalendar2 = Calendar
                .getInstance();
        startCalendar1.setTime(startDate);
        endCalendar2.setTime(endDate);
        long startTime1 = startCalendar1.getTimeInMillis();
        long endTime2 = endCalendar2.getTimeInMillis();
        long result = (endTime2 - startTime1) / (1000 * 60 * 60 * 24);
        return result;
    }

    public static String getNowTime() {
        Date d = new Date(); // Get current date to d.
        SimpleDateFormat fm = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss"); // Set
        // date
        // format
        String strDate = fm.format(d); // Get date to string strDate via format
        // fm.
        return strDate;
    }

    /**
     *
     * @function：获取两个日期间月差 2014-01-15"014-03-14=0 2014-01-15"014-03-15=1
     * @param startDate
     * @param endDate
     * @return
     * @throws Exception
     * @returnType：int
     * @author：xupeng
     * @createTime：May 28, 2014
     */
    public static int diffMonth(Date startDate, Date endDate) throws Exception {
        int diffMonth;
        Calendar starCal = Calendar.getInstance();
        starCal.setTime(startDate);
        int sYear = starCal.get(Calendar.YEAR);
        int sMonth = starCal.get(Calendar.MONTH);
        int sDay = starCal.get(Calendar.DAY_OF_MONTH);

        Calendar endCal = Calendar.getInstance();
        endCal.setTime(endDate);
        int eYear = endCal.get(Calendar.YEAR);
        int eMonth = endCal.get(Calendar.MONTH);
        int eDay = endCal.get(Calendar.DAY_OF_MONTH);

        diffMonth = (eYear - sYear) * 12;

        if (sMonth != eMonth) {
            if (eDay >= sDay) {
                diffMonth += (eMonth - sMonth);
            } else {
                diffMonth += (eMonth - sMonth - 1);
            }
        }
        return diffMonth;
    }

    /**
     *
     * @function：获取两个日期间月差 2014-01-15"014-03-14=0 2014-01-15"014-03-15=1
     * @param startDateStr
     * @param endDateStr
     * @return
     * @throws Exception
     * @returnType：int
     * @author：xupeng
     * @createTime：May 28, 2014
     */
    public static int diffMonth(String startDateStr, String endDateStr)
            throws Exception {
        SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
        Date startDate = fmt.parse(startDateStr);
        Date endDate = fmt.parse(endDateStr);
        return DateUtil.diffMonth(startDate, endDate);
    }

    /**
     *
     * @function：获得定时器首次执行时间
     * @param target
     *            HH:mm:ss
     * @return
     * @throws Exception
     * @returnType：long
     * @author：xupeng
     * @createTime：Jun 12, 2014
     */
    public static long diffMSForTimer(String target) throws Exception {
        Date now = new Date();
        String targetDateStr = DateUtil.format(now, "yyyy-MM-dd") + " "
                + target;
        Date targetDate = DateUtil.parseDate(targetDateStr,
                "yyyy-MM-dd HH:mm:ss");
        long nowTimes = now.getTime();
        long targetDateTimes = targetDate.getTime();
        if (targetDateTimes < nowTimes) {
            targetDateTimes = targetDateTimes + 86400000;
        }
        return targetDateTimes - nowTimes;
    }

    /**
     * 获得当前时间（Timestamp类型"
     */
    public static Timestamp getNewTimestamp() {
        return new Timestamp(new Date().getTime());
    }

    /**
     * 获取当前系统时间
     *
     * @author liaoxinwei
     * @return Date
     */
    public static Date getNewDate() {
        return new Date();
    }

    /**
     * 计算未来多少天之后的日期
     * @param startTime 累加的天
     * @param days 累加的天
     * @return 累加后的日期
     * @throws ParseException
     */
    public static String getAddDaysTime(String startTime, int days) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date d;
        if (StringUtil.isEmpty(startTime)) {
            d = new Date();

        } else {
            try {
                d = format.parse(startTime);
            } catch (ParseException e) {
                d = new Date();
            }
        }
        Calendar ca = Calendar.getInstance();
        ca.add(Calendar.DATE, days);// days为增加的天数，可以改变的
        d = ca.getTime();
        String backTime = format.format(d);
        return backTime;
    }

    public static String getAddDaysTimeEnhancedEdition(String startTime, int days) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); // 日期格式
        Date date = null;
        try {
            date = dateFormat.parse(startTime);// 指定日期
        } catch (ParseException e) {
            e.printStackTrace();
        }
        try {
            date = addDate(date, days);// 指定日期加上天数

        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dateFormat.format(date.getTime() - (long)1 * 24 * 60 * 60 * 1000);
    }

    public static String getAddDaysTimeFormat(String format, String startTime, int days) {
        SimpleDateFormat dateFormat = new SimpleDateFormat(format); // 日期格式
        Date date = null;
        try {
            date = dateFormat.parse(startTime);// 指定日期
        } catch (ParseException e) {
            e.printStackTrace();
        }
        try {
            date = addDate(date, days);// 指定日期加上天数

        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dateFormat.format(date.getTime() - (long)1 * 24 * 60 * 60 * 1000);
    }

    public static Date addDate(Date date,long day) throws ParseException {
        long time = date.getTime(); // 得到指定日期的毫秒数
        day = day*24*60*60*1000; // 要加上的天数转换成毫秒数
        time+=day; // 相加得到新的毫秒数
        return new Date(time); // 将毫秒数转换成日期
    }

    /**
     * 判断邮件"��链接是否失效
     *
     * @author liaoxinwei
     * @param sendTime
     * @return true(失效)，false(有效)
     */
    public static boolean isEmailUrlFailure(String sendTime) {
        long sendTimeL = Long.valueOf(sendTime);
        return new Date().getTime() - sendTimeL > 1000 * 60 * 60 * 24;
    }

    /**
     * 判断用户是否享受利润("��)
     * @param register_date
     * @return
     */
    public static boolean isShareProfitAndBonus(Date register_date) {
        if (null == register_date) {
            return false;
        }
        // 有效期：1"
        String valiable_date = addDate(register_date, 1, 1);
        Date curdate = new Date();
        // 格式化日期：yyyy-MM-dd
        String startDate = addDate(curdate, 3, 0);
        long diff = getTimeOut(startDate, valiable_date);
        if (diff <= 0) {
            return false;
        }
        return true;
    }

    /**
     * 获取2个日前相差的天数
     *
     * @param time1
     *            时间1
     * @param time2
     *            时间2
     * @return
     */
    public static long getTimeOut(String time1, String time2) {
        SimpleDateFormat smdf = new SimpleDateFormat("yyyy-MM-dd");
        long t = 0;
        try {
            Date start = smdf.parse(time1);
            Date end = smdf.parse(time2);
            t = (end.getTime() - start.getTime()) / (3600 * 24 * 1000);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return t;
    }

    /**
     * 获取钱金币过期时"
     *
     * @author liliangfeng
     * @param date
     * @return
     */
    public static Date getQJBEndValidDate(Date date) {
        if (date == null) {
            date = new Date();
        }
        return DateUtil.parseDate(DateUtil.addDate(date, 1, 1));
    }

    public static String formatTimeStampStringToClientByShow(
            Timestamp timestamp) {
        Date date;
        if (timestamp == null) {
            return "--";
        } else {
            date = new Date(timestamp.getTime());
        }
        try {
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            return df.format(date);
        } catch (Exception ex) {
            // ex.printStackTrace();
            return null;
        }
    }

    /**
     * 将一"yyyy-MM-dd HH:mm:ss"字符串，转换"yyyy年MM月dd日HH时mm分ss"的字符串
     *
     * @param dateStr
     * @return
     */
    public static String getZhCNDateTime(String dateStr) {
        Date d = getDate(dateStr);
        return dateToDateString(d, ZHCN_DATATIMEF_STR);
    }

    public static String getDataFMTDate(String dateStr) {
        Date d = getDate(dateStr, DATAFORMAT_STR);
        return dateToDateString(d, DATAFORMAT_STR);
    }


    /**
     * 按照默认显示日期时间的格"yyyy-MM-dd HH:mm:ss"，转化dateTimeStr为Date类型
     * dateTimeStr必须"yyyy-MM-dd HH:mm:ss"的形"
     *
     * @param dateTimeStr
     * @return
     */
    public static Date getDate(String dateTimeStr) {
        return getDate(dateTimeStr, DATATIMEF_STR);
    }

    /**
     * 按照默认formatStr的格式，转化dateTimeStr为Date类型 dateTimeStr必须是formatStr的形"
     *
     * @param dateTimeStr
     * @param formatStr
     * @return
     */
    public static Date getDate(String dateTimeStr, String formatStr) {
        try {
            if (dateTimeStr == null || dateTimeStr.equals("")) {
                return null;
            }
            DateFormat sdf = getDateFormat(formatStr);
            Date d = sdf.parse(dateTimeStr);
            return d;
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    public static DateFormat getDateFormat(String formatStr) {
        if (formatStr.equalsIgnoreCase(DATAFORMAT_STR)) {
            return dateFormat;
        } else if (formatStr.equalsIgnoreCase(DATATIMEF_STR)) {
            return dateTimeFormat;
        } else if (formatStr.equalsIgnoreCase(ZHCN_DATAFORMAT_STR)) {
            return zhcnDateFormat;
        } else if (formatStr.equalsIgnoreCase(ZHCN_DATATIMEF_STR)) {
            return zhcnDateTimeFormat;
        } else {
            return new SimpleDateFormat(formatStr);
        }
    }

    /**
     * 将Date转换成formatStr格式的字符串
     *
     * @param date
     * @param formatStr
     * @return
     */
    public static String dateToDateString(Date date, String formatStr) {
        DateFormat df = getDateFormat(formatStr);
        return df.format(date);
    }

    /**
     * 格式化timestamp为中文日期格"
     *
     * @param timestamp
     * @return
     */
    public static String formatTimeStampStringToClient(Timestamp timestamp) {
        Date date;
        if (timestamp == null) {
            return "--";
        } else {
            date = new Date(timestamp.getTime());
        }
        try {
            SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd HH时mm分ss");
            return df.format(date);
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

    /**
     * 获取当月第一天
     *
     * @return
     */
    public static Date getCurrentMonthFirstDay(){
        Calendar cale = Calendar.getInstance();
        cale.add(Calendar.MONTH, 0);
        cale.set(Calendar.DAY_OF_MONTH, 1);
        return cale.getTime();
    }

    /**
     * 获取当月最后一天
     *
     * @return
     */
    public static Date getCurrentMonthLastDay(){
        Calendar cale = Calendar.getInstance();
        cale.add(Calendar.MONTH, 1);
        cale.set(Calendar.DAY_OF_MONTH, 0);
        return cale.getTime();
    }


    /**
     * 获取前一个月第一天"
     *
     * @return
     */
    public static Date getPreMonthFirstDay(){
        Calendar cale = Calendar.getInstance();
        cale.add(Calendar.MONTH, -1);
        cale.set(Calendar.DAY_OF_MONTH,1);
        return cale.getTime();
    }

    /**
     * 获取前一个样最后一天
     *
     * @return
     */
    public static Date getPreMonthLastDay(){
        Calendar cale = Calendar.getInstance();
        cale.set(Calendar.DAY_OF_MONTH, 0);
        return cale.getTime();
    }
    /**
     * 获取当月第一天
     *
     * @return
     */
    public static String getCurrentMonthFirstDayStr(){
        return FORMATTER.format(getCurrentMonthFirstDay());
    }

    /**
     * 获取当月最后一天
     *
     * @return
     */
    public static String getCurrentMonthLastDayStr(){
        return FORMATTER.format(getCurrentMonthLastDay());
    }

    /**
     * 给当前时间加秒数生成时间"
     * @param date
     * @param i
     * @return
     */
    public static Date addOneSecond(Date date,int i) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MINUTE, i);
        return calendar.getTime();
    }

    /**
     * 格式化timestamp为中文日期格"
     *
     * @param timestamp
     * @return
     */
    public static String formatTimeStampToYYYYMMDDHHMMSS(Timestamp timestamp) {
        Date date;
        if (timestamp == null) {
            return null;
        } else {
            date = new Date(timestamp.getTime());
        }
        try {
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return df.format(date);
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

    /**
     * 获取当前日期yyyy-MM-dd的形"
     *
     * @return
     */
    public static String getCurDateStr() {
        return dateToDateString(Calendar.getInstance().getTime(), DATAFORMAT_STR);
    }

    /**
     * 获取当前日期yyyy-MM-dd的形"
     *
     * @return
     */
    public static String getCurYMDateStr() {
        return dateToDateString(Calendar.getInstance().getTime(), YMDATEFORMAT_STR);
    }

    public static String getCurMonthDateStr() {
        return dateToDateString(Calendar.getInstance().getTime(), YYYY_MM_DATAFORMAT_STR);
    }


    public static String getCurMonthDateDotStr() {
        return dateToDateString(Calendar.getInstance().getTime(), YYYY_MM_DATAFORMAT_STR_DOT);
    }

    /**
     * 获取某个月的天数
     * @param date
     * @return
     */
    public static int getDaysOfMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    }


    /**
     * 获取任意时间的月的最后一天
     * 描述:<描述函数实现的功能>.
     * @param repeatDate
     * @return
     */
    public static String getMaxMonthDate(String repeatDate) {
        SimpleDateFormat dft = new SimpleDateFormat(DATAFORMAT_STR);
        Calendar calendar = Calendar.getInstance();
        try {
            if(StringUtil.isBlank(repeatDate) && !"null".equals(repeatDate)){
                calendar.setTime(dft.parse(repeatDate));
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }

        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        return dft.format(calendar.getTime());
    }


    public static String getCurrentDaysPreMonthDate(){
        Calendar ca = Calendar.getInstance();// 得到一个Calendar的实例
        ca.setTime(new Date()); // 设置时间为当前时间
//		    ca.set(2011, 11, 17);// 月份是从0开始的，所以11表示12月
//		    ca.add(Calendar.YEAR, -1); // 年份减1
        ca.add(Calendar.MONTH, -1);// 月份减1
//		    ca.add(Calendar.DATE, -1);// 日期减1
        Date resultDate = ca.getTime(); // 结果
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(resultDate);
    }

    public static int getDateCount(String startDate, String endDate) {
        SimpleDateFormat smdf = new SimpleDateFormat("yyyy-MM-dd");
        long t = 0;
        try {
            Date start = smdf.parse(startDate);
            Date end = smdf.parse(endDate);
            t = (end.getTime() - start.getTime()) / (3600 * 24 * 1000);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        int ret =Integer.parseInt(t+"");
        return ret;
    }

    public static String getNextDay(String str, int days){
        // 时间表示格式可以改变，yyyyMMdd需要写例如20160523这种形式的时间
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
        // 将字符串的日期转为Date类型，ParsePosition(0)表示从第一个字符开始解析
        Date date = sdf.parse(str, new ParsePosition(0));
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // add方法中的第二个参数n中，正数表示该日期后n天，负数表示该日期的前n天
        calendar.add(Calendar.DATE, days);
        Date date1 = calendar.getTime();
        String out = sdf.format(date1);
        return out;
    }

    public static void main(String []str){
        String time1 ="2017-07-03";
        String time2="2017-09-03";
        System.out.println(getCurMonthDateDotStr());
    }
}
